require 'language'

# le monde est en deux dimensions

let :World2D, Entity.with(:x => Axis, :y => Axis)

# un emplacement est sur le monde et est situé sur les axes x et y

let :Position, Entity.with(:name => String).upon(World2D, :x, :y)

# un repère hérite de emplacement et est caractérisé par une taille

let :Hideout, Position.with(:size => Integer)

# une divinité

let :Divinity, Entity.with(:name => String)

# un lieu de culte hérite de emplacement et est caractérisé par une divinité

let :WorshipPlace, Position.with(:divinity => Divinity)

# une ressource

let :Ressource, Entity.with(:name => String)

# une ville hérite de emplacement

let :City, Position



# EARTH TIME

def bissextile(year)
  return  year % 4 == 0 && year % 100 != 0 or year % 4 == 0 && year % 100 == 0 && year % 400 == 0
end



months = [
  NamedCountStep.new(:name=> "January", :threshold => 31),
  NamedCountStep.new(:name=> "February", :threshold => 28,
    :changed =>
      lambda { |earthTime, prevValue, value|
      if bissextile(earthTime.Year) 
        then value > :threshold + 1
      else value > :threshold
      end}),
  NamedCountStep.new(:name=> "March", :threshold => 31),
  NamedCountStep.new(:name=> "April", :threshold => 30)
]

# the base unit will be the millisecond
let :EarthTime, UnitCounter.withLevels(
  :Second => CountStep.new(:threshold => 1000),
  :Minute => CountStep.new(:threshold => 60),
  :Hour => CountStep.new(:threshold => 60),
  :Day => CountStep.new(:threshold => 24),
  :Month => months,
  :Year => CountStep.new(:changed =>
      # prevValue and value are in this cas NamedCountSteps
    lambda { |earthTime, prevValue, value|
      return earthTime.Month.isLast(prevValue) == 11 && earthTime.Month.isFirst(value) == 1
    })
)


